<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script>
     /*
     创建一个空对象，作为将要返回的对象实例
     将这个空对象的原型，指向构造函数的prototype属性
     将这个空对象赋值给函数内部的this关键字
     开始执行构造函数内部的代码
     */

     function Person(name,age){
         this.name = name;
         this.age = age;
     }
     Person.prototype.say = function(){
         console.log(this.name);
     }


//     var p = new Person('frank');

     var p = new Person();

     // 将原型对象中的方法复制到一个新的对象中
     //再将当前函数内的相关属性生成，借助于 call或apply
     function _new(){
        //arguments
//         console.log(arguments);
         var args = [].slice.call(arguments);//0,1,2,3,4....这样数组,将对象转换成数组
//         console.log(args);
         var constructor = args.shift();//返回数组中的第一个元素，并将这个元素在数组中删除
//         console.log(args);
         var o = Object.create(constructor.prototype)
         Person.apply(o,args);
         return o;
     }

     var p2 = _new(Person,'tom',19);



//    function _new(/* 构造函数 */ constructor, /* 构造函数参数 */ param1) {
//        // 将 arguments 对象转为数组
//        var args = [].slice.call(arguments);
//        // 取出构造函数
//        var constructor = args.shift();
//        // 创建一个空对象，继承构造函数的 prototype 属性
//        var context = Object.create(constructor.prototype);
//        // 执行构造函数
//        var result = constructor.apply(context, args);
//        // 如果返回结果是对象，就直接返回，则返回 context 对象
//        return (typeof result === 'object' && result != null) ? result : context;
//    }
//



</script>
</body>
</html>